const db = uniCloud.database();
const studentCollection = db.collection('student');
const dbCmd = db.command;

module.exports = {
  _before: function() {
    // 通用前置处理
  },
  
  /**
   * 获取学生列表
   * @param {Object} params - 查询参数
   * @param {String} params.name - 学生姓名或拼音（可选）
   * @param {String} params.grade - 年级（可选）
   * @param {String} params.class - 班级（可选）
   * @param {Number} params.status - 状态（可选）
   * @param {Number} params.page - 页码
   * @param {Number} params.pageSize - 每页数量
   * @returns {Object} 学生列表和总数
   */
  async getStudentList(params = {}) {
    const { name, grade, class: className, status, page = 1, pageSize = 10 } = params;
    
    console.log('收到查询参数：', params);
    
    // 构建查询条件
    const query = {};
    if (name) {
      // 使用正则表达式匹配名字字段
      // 支持直接匹配汉字或拼音的前缀搜索
      query.name = new RegExp(name, 'i');
      
      // 如果数据库中有name_pinyin字段，可以添加对拼音的搜索支持
      // 这里假设搜索是在前端进行的，所以我们需要在前端做排序和过滤
    }
    if (grade) query.grade = grade;
    if (className) query.class = className;
    if (status !== undefined && status !== '') query.status = Number(status); // 转换为数字类型
    
    console.log('构建的查询条件：', query);
    
    // 查询总数
    const countResult = await studentCollection.where(query).count();
    const total = countResult.total;
    
    console.log('查询到的总数：', total);
    
    // 查询分页数据，不在后端排序，交给前端处理
    const list = await studentCollection
      .where(query)
      .skip((page - 1) * pageSize)
      .limit(pageSize)
      .get()
      .then(res => res.data);
    
    console.log('查询到的数据:', list.length, '条');
    
    return {
      list,
      total,
      page,
      pageSize
    };
  },
  
  /**
   * 获取学生详情
   * @param {String} id - 学生ID
   * @returns {Object} 学生详情
   */
  async getStudentDetail(id) {
    if (!id) throw new Error('学生ID不能为空');
    
    const student = await studentCollection.doc(id).get().then(res => res.data[0]);
    if (!student) throw new Error('学生不存在');
    
    return student;
  },
  
  /**
   * 创建学生
   * @param {Object} data - 学生数据
   * @returns {Object} 创建结果
   */
  async createStudent(data) {
    // 验证数据
    const { name, grade, class: className, parent_name, parent_phone } = data;
    if (!name) throw new Error('学生姓名不能为空');
    if (!grade) throw new Error('年级不能为空');
    if (!className) throw new Error('班级不能为空');
    
    // 只有当提供了电话号码时才检查格式
    if (parent_phone && !/^1\d{10}$/.test(parent_phone)) {
      throw new Error('家长联系电话格式不正确');
    }
    
    // 创建学生
    const result = await studentCollection.add({
      ...data,
      status: data.status || 1,
      create_date: new Date(),
      update_date: new Date()
    });
    
    return {
      id: result.id,
      success: true
    };
  },
  
  /**
   * 更新学生
   * @param {String} id - 学生ID
   * @param {Object} data - 更新数据
   * @returns {Object} 更新结果
   */
  async updateStudent(id, data) {
    if (!id) throw new Error('学生ID不能为空');
    
    // 如果有电话号码，验证格式
    if (data.parent_phone && !/^1\d{10}$/.test(data.parent_phone)) {
      throw new Error('家长联系电话格式不正确');
    }
    
    // 更新学生
    await studentCollection.doc(id).update({
      ...data,
      update_date: new Date()
    });
    
    return {
      id,
      success: true
    };
  },
  
  /**
   * 更新学生状态
   * @param {String} id - 学生ID
   * @param {Number} status - 状态：1 在读，0 退学
   * @returns {Object} 更新结果
   */
  async updateStudentStatus(id, status) {
    if (!id) throw new Error('学生ID不能为空');
    if (![0, 1].includes(status)) throw new Error('状态值不正确');
    
    await studentCollection.doc(id).update({
      status,
      update_date: new Date()
    });
    
    return {
      id,
      success: true
    };
  },
  
  /**
   * 删除学生
   * @param {String} id - 学生ID
   * @returns {Object} 删除结果
   */
  async deleteStudent(id) {
    if (!id) throw new Error('学生ID不能为空');
    
    // 检查是否有关联的报名记录
    const enrollmentCount = await db.collection('enrollment')
      .where({ student_id: id, status: 1 })
      .count();
    
    if (enrollmentCount.total > 0) {
      throw new Error('该学生有关联的报名记录，无法删除');
    }
    
    await studentCollection.doc(id).remove();
    
    return {
      id,
      success: true
    };
  },
  
  /**
   * 获取年级和班级列表，用于筛选
   * @returns {Object} 年级和班级列表
   */
  async getGradeAndClassList() {
    const data = await studentCollection.field({ grade: true, class: true }).get().then(res => res.data);
    
    // 提取不重复的年级和班级
    const grades = [...new Set(data.map(item => item.grade))];
    const classes = [...new Set(data.map(item => item.class))];
    
    // 按照升序排序
    grades.sort();
    classes.sort((a, b) => parseInt(a) - parseInt(b)); // 班级按照数字大小排序
    
    return {
      grades,
      classes
    };
  },
  
  /**
   * 调试方法：获取所有数据，不使用筛选条件
   * @returns {Array} 所有学生数据
   */
  async debugGetAllStudents() {
    // 直接查询所有数据
    const result = await studentCollection.get();
    return {
      count: result.data.length,
      data: result.data
    };
  }
}; 